using System;
using System.Collections.Generic;
using System.Text;
using EntidadesTO;
using LogicaNegocio;
using System.Transactions;

namespace Controladoras
{
    public class CuentaCorrienteMantenedor
    {
        private static CuentaCorrienteMantenedor instancia;
        private List<CuentaCorrienteTO> listaCuentaCorriente;
        private CuentaCorrienteBL cuentaCorrienteBL;

        public static CuentaCorrienteMantenedor ObtenerInstancia()
        {
            if (instancia == null)
            {
                instancia = new CuentaCorrienteMantenedor(); 
            }
            return instancia;
        }

        //Constructor de la clase
        private CuentaCorrienteMantenedor()
        {
            listaCuentaCorriente = new List<CuentaCorrienteTO>();
            cuentaCorrienteBL = new CuentaCorrienteBL();
        }
        
        public void BuscarDeuda(int pCodPersona, DateTime pFecha)
        {
            listaCuentaCorriente = cuentaCorrienteBL.ListarCuentaCorriente_deuda(pCodPersona, pFecha);
        }

        public void BuscarFinanciadoDeuda(int pCodPersona, DateTime pFecha)
        {
            listaCuentaCorriente = cuentaCorrienteBL.ListarCuentaCorriente_financiado_deuda(pCodPersona, pFecha);
        }

        public void GrabarCuentaCorriente(List<EntidadAutoavaluoTO> pListaAutoavaluo, int pCodCampana)
        {
            CampanaMantenedor.ObtenerInstancia().CargarListaPorLlave(pCodCampana);
            CampanaTO campanaTO = CampanaMantenedor.ObtenerInstancia().ListarCampana[0];
            
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    for (int i = 0; i < pListaAutoavaluo.Count; i++)
                    {
                        decimal montoCuota = cuentaCorrienteBL.CalcularCuota(pListaAutoavaluo[i].MontoAutoavaluo);
                        DateTime fechaBase = campanaTO.FecInicio;
                        for (int j = 0; j < 4; j++)
                        {
                            CuentaCorrienteTO cuentaTO = new CuentaCorrienteTO();
                            cuentaTO.Anho = fechaBase.Year;
                            cuentaTO.CodTrimestre = j + 1;
                            cuentaTO.Importe = montoCuota;
                            cuentaTO.FeHoComprobante = fechaBase;

                            //como las cuotas son trimestrales
                            fechaBase = fechaBase.AddMonths(3);
                            cuentaTO.FechaVencimiento = fechaBase;

                            cuentaTO.CodPersonaPaga = pListaAutoavaluo[i].CodPersona;
                            cuentaTO.CodTImpuesto = 1; //Impuesto predial
                            cuentaTO.CodTOperacion = 1; //movimiento de cargo

                            cuentaTO.NumJurada = pListaAutoavaluo[i].NumJurada;
                            cuentaTO.CodPredio = pListaAutoavaluo[i].CodPredio;

                            cuentaCorrienteBL.GuardarNuevo(cuentaTO);
                        }
                        
                    }

                    CampanaMantenedor.ObtenerInstancia().ActualizarEstado(2, campanaTO.CodCampana);

                    contexto.Complete();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void ActualizarAbonos(List<InformacionAbonosTO> pListaInfoTO)
        {
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    for (int i = 0; i < pListaInfoTO.Count; i++)
                    {
                        cuentaCorrienteBL.ActualizarAbono(pListaInfoTO[i]);
                    }
                    contexto.Complete();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void FinanciarCuentaCorriente(int pNumComprobante, int pNumeroSolicitud, DateTime pFecha)
        {
            try
            {
                cuentaCorrienteBL.ActualizarFinanciamiento(pNumComprobante, pNumeroSolicitud, pFecha);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void GrabarCuentaCorriente_individual(CuentaCorrienteTO pCuentaCorriente)
        {
            try
            {
                cuentaCorrienteBL.GuardarNuevo(pCuentaCorriente);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //Devolver la lista de documentos legales
        public List<CuentaCorrienteTO> ListaCuentaCorriente
        {
            get
            {
                return this.listaCuentaCorriente;
            }
        }
    }
}
